﻿#include "WRWorkGuiConfigProvider.h"

#include "../../WRSoft-Utility/Runtime/WRClass.h"
#include "../../WRSoft-Utility/Runtime/WRAppServiceActivator.h"

#include <QFile>
#include <QDomDocument>

//获取工作界面配置提供者类型。
WRType* WRTypes::workGuiConfigProvider(void)
{
    static WRType* type = WRType::enroll(WRWorkGuiConfigProviderType, WRTypes::appService());
    return type;
}

//获取对象类型。
WRType* WRWorkGuiConfigProvider::type(void) const
{
    return WRTypes::workGuiConfigProvider();
}

//表示工作界面文件配置提供者。
class WRWorkGuiFileConfigProvider : public WRWorkGuiConfigProvider
{
private:
    QString m_fileName;

public:
    //初始化工作界面文件配置提供者。
    WRWorkGuiFileConfigProvider(const QString& fileName)
    {
        m_fileName = fileName;
    }

    //获取配置内容。
    QDomElement content(void)
    {
        QFile file(m_fileName);
        if (!file.open(QFile::ReadOnly | QFile::Text))
        {
            return QDomElement();
        }
        QDomDocument document;
        if (!document.setContent(&file, true)) {
            file.close();
            return QDomElement();
        }
        return document.documentElement();
    }
};
//表示工作界面直接配置提供者。
class WRWorkGuiDirectConfigProvider : public WRWorkGuiConfigProvider
{
private:
    QDomElement m_content;

public:
    //初始化工作界面直接配置提供者。
    WRWorkGuiDirectConfigProvider(const QDomElement& content)
        : m_content(content)
    {
        //add code here
    }

    //获取配置内容。
    QDomElement content(void)
    {
        return m_content;
    }
};

//表示工作界面文件配置提供者激活器。
class WRWorkGuiFileConfigProviderActivator : public WRAppServiceActivator
{
public:
    //初始化当前对象。
    WRWorkGuiFileConfigProviderActivator(void)
    {
        QChar className[] = WRWorkGuiFileConfigProviderStrArr;
        WRClass::enroll(WRWorkGuiFileConfigProviderClass, QString(className, WRWorkGuiFileConfigProviderStrLen), this);
    }
    //释放当前对象所占用的相关资源。
    ~WRWorkGuiFileConfigProviderActivator(void)
    {
        //add code here
    }

    //创建应用服务实例。
    WRAppService* create(const QDomElement &GuiConfig)
    {
        QChar fileNameLiteral[] = {'f','i', 'l', 'e', 'N', 'a', 'm', 'e'};
        QString fileNameNodeName = QString::fromRawData(fileNameLiteral, 8);
        QDomElement element = GuiConfig.firstChildElement(fileNameNodeName);
        if (!element.isNull())
        {
            QString fileName = element.text();
            if (!fileName.isNull() && !fileName.isEmpty())
            {
                return new WRWorkGuiFileConfigProvider(fileName);
            }
        }
        return 0;
    }
};
static WRWorkGuiFileConfigProviderActivator g_workGuiFileConfigProviderActivator;

//表示工作界面直接配置提供者激活器。
class WRWorkGuiDirectConfigProviderActivator : public WRAppServiceActivator
{
public:
    //初始化当前对象。
    WRWorkGuiDirectConfigProviderActivator(void)
    {
        QChar className[] = WRWorkGuiDirectConfigProviderStrArr;
        WRClass::enroll(WRWorkGuiDirectConfigProviderClass, QString(className, WRWorkGuiDirectConfigProviderStrLen), this);
    }
    //释放当前对象所占用的相关资源。
    ~WRWorkGuiDirectConfigProviderActivator(void)
    {
        //add code here
    }

    //创建应用服务实例。
    WRAppService* create(const QDomElement &GuiConfig)
    {
        return new WRWorkGuiDirectConfigProvider(GuiConfig);
    }
};
static WRWorkGuiDirectConfigProviderActivator g_workGuiDirectConfigProviderActivator;
